// Copyright (C) 2022 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
//
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<广西木子科技有限公司>，授权编号：<NT220402151538>，代码指纹：<A.648883738.885>，技术对接人微信：<ID: Lingmuziyi>】
// 【授权寄送：<收件：李先生、地址：南宁市科园西十路11号国电智能大厦1101F、电话：17736659550、邮箱：yingshashou@vip.qq.com>】
//
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
//
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rainbowchat;

import javax.servlet.ServletContextEvent;

import com.eva.framework.WebListener;
import com.eva.framework.dbpool.DBShell;
import com.x52im.rainbowchat.cache.ConfigCacheProvider;
import com.x52im.rainbowchat.cache.GroupsInfoCacheProvider;
import com.x52im.rainbowchat.cache.GroupsMembersCacheProvider;
import com.x52im.rainbowchat.cache.UsersInfoCacheProvider;
import com.x52im.rainbowchat.http.file.TimmingRestoreImgAndVoice;
import com.x52im.rainbowchat.http.logic.TimmingRestoreMessages;
import com.x52im.rainbowchat.http.logic.pay.alipay.AlipayClientTools;
import com.x52im.rainbowchat.im.ChatServerLauncher;
import com.x52im.rainbowchat.im.JedisDateSource;

/**
 * 本类是RainbowChat的服务端Java Web模块的Listener实现类。
 * <p>
 * 对于JavaEE规范来说，Listener类会在Tomcat等应用服务器启动后自动被调用，所以RainbowChat
 * 服务端中某些需要自动启动的服务、守护线程等放在本类中启动和关闭即可。
 *
 * @author JackJiang
 * @since 1.0
 */
public class WebListenerEx extends WebListener {
    /**
     * The web module is ready to process requests.
     * {@inheritDoc}
     */
    public void contextInitialized(ServletContextEvent servletContextEvt) {
        super.contextInitialized(servletContextEvt);

        try {
            // 【重要】优先设置要连接的数据库类型（请根据您连接的DB类型正确地设置哦！）
//			DBShell.DB_TYPE = DBShell.DBType.sqlServer;
            DBShell.DB_TYPE = DBShell.DBType.mySql;

            // 初始化redis连接
            JedisDateSource.getInstance();

            // 载入系统使用的参数配置缓存
            ConfigCacheProvider.getInstance().init();

            // 支付宝客户端初始化
            AlipayClientTools.getInstance();

            // 启动定期转储过期图片、语音、短视频的处理线程
            TimmingRestoreImgAndVoice.getInstance().start();
            // 启动定期转储过期聊天记录、离线消息的处理线程
            TimmingRestoreMessages.getInstance().start();

            // 载入用户基本信息高速缓存数据（保证ios设备离线消息推送时的高性能）
            UsersInfoCacheProvider.getInstance().init();
            // 载入群基本信息高速缓存数据（保证ios设备离线消息推送时的高性能）
            GroupsInfoCacheProvider.getInstance().init();
            // 载入群成员列表高速缓存数据（保证系统群聊时的高性能）
            GroupsMembersCacheProvider.getInstance().init();

            // 启动IM实例（放最后启动时机刚好）
            ChatServerLauncher.getInstance().startup();
        } catch (Exception e) {
            System.err.println("[HTTP]【N】聊天服务器启动时出错，原因是:" + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * The servlet context is about to be shut down.
     * {@inheritDoc}
     */
    public void contextDestroyed(ServletContextEvent servletContextEvt) {
        super.contextDestroyed(servletContextEvt);

        try {
            // 关闭IM实例（优先关闭，时机刚好）
            ChatServerLauncher.getInstance().shutdown();

            // 清除缓存
            UsersInfoCacheProvider.getInstance().removeAll();
            // 清除缓存
            GroupsInfoCacheProvider.getInstance().removeAll();
            // 清除缓存
            GroupsMembersCacheProvider.getInstance().removeAll();
            // 清除缓存
            ConfigCacheProvider.getInstance().removeAll();

            // 关闭定期转储过期图片和语音的处理线程
            TimmingRestoreImgAndVoice.getInstance().stop();
            // 关闭定期转储过期聊天记录、离线消息的处理线程
            TimmingRestoreMessages.getInstance().stop();
        } catch (Exception e) {
            System.err.println("[HTTP]【N】聊天服务器关闭时出错，原因是:" + e.getMessage());
            e.printStackTrace();
        }
    }

}
